package com.yanxu.lock.lock;

import java.util.concurrent.locks.ReentrantLock;

/**
 * @author 折戟沉沙铁未销
 * @version V1.0
 * @date 2025/3/16-2025
 * @Description: lockInterruptibly() 在等锁期间，可以响应中断
 */
public class Lock_LockInterruptibly implements Runnable {

    static ReentrantLock reentrantLock=new ReentrantLock();

    public static void main(String[] args) throws InterruptedException {
        Lock_LockInterruptibly runnable = new Lock_LockInterruptibly();
        Thread thread1 = new Thread(runnable);
        thread1.start();

        Thread thread2 = new Thread(runnable);
        thread2.start();

        Thread.sleep(1000);
        thread2.interrupt();
    }

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName() + " 尝试获取锁!!!");
        try {
            reentrantLock.lockInterruptibly();
            try {
                System.out.println(Thread.currentThread().getName()+" 成功获取到了锁，执行自己的业务逻辑!!!");
                Thread.sleep(5000);
                System.out.println(Thread.currentThread().getName()+" 业务逻辑执行完毕!!!");
            }catch (InterruptedException e){
                System.out.println(Thread.currentThread().getName()+" 获取到了锁。但是在睡眠期间被中断了!!!");
            }finally {
                reentrantLock.unlock();
                System.out.println(Thread.currentThread().getName()+" 释放了锁!!!");
            }
        } catch (InterruptedException e) {
            System.out.println(Thread.currentThread().getName()+" 没有获取到锁，在等锁期间被中断了!!!");
        }
    }

    /*
    *
    *  Thread-0 尝试获取锁!!!
    *  Thread-1 尝试获取锁!!!
    *  Thread-0 成功获取到了锁，执行自己的业务逻辑!!!
    *  Thread-1 没有获取到锁，在等锁期间被中断了!!!
    *  Thread-0 业务逻辑执行完毕!!!
    *  Thread-0 释放了锁!!!
    *
    * 分析输出结果：
    *   根据输出的结果可以看到。一共两个线程。
    *       线程1、线程2 同时尝试获取锁。
    *   但是，只能有一个线程获取到锁，因此线程0 首先获取到了锁，执行锁逻辑。
    *   线程1，在 lock.lockInterruptibly(); 等待锁。
    *   在等待的过程中，线程1被中断了，可以看到 线程1可以响应中断。 这就是 lock.lockInterruptibly() 方法的效果。
    *
    *
    * */
}